/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import net.sf.json.JSONObject;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.util.ComunAction;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.hibernate.HibernateException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import sv.com.compassion.entidades.Beneficiario;
import sv.com.compassion.entidades.Cdi;
import sv.com.compassion.entidades.Empleado;
import sv.com.compassion.entidades.Municipio;
import sv.com.compassion.entidades.Nivelescolaridad;
import sv.com.compassion.util.Constantes;


/** Clase para el logon y logout. 
* @author grupo de Tesis
*/
public class LoginAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private String bandCerrar;
    private String nomUsuario;
    private String passUsuario;
    private String cargoUsuario;
 
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a las clases entidades Empleado. 
 */    
public LoginAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
}
/**
 * Se ejecuta la validación del usuario y se devuelve el msj de éxito o fallo.
 */ 
    private String ruta;
    
    @Override
    public String execute(){
            int total = 0;
            int idEmpleado = 0;
            String nomEmpleado = "";
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
            int idCargo = 0;
            List<Empleado> listaEmpleado = null;
            String query="";
            bandCerrar = getRequest().getParameter("Cerrar");
           
            if(bandCerrar.equals("1")){
                Map session = ActionContext.getContext().getSession();
                session.put("idUsuario","");
                session.put("idCargo","");
                session.put("nomEmpleado", "");
                session.clear();                
            }else{
                nomUsuario = getRequest().getParameter("NomUsuario");
                passUsuario = getRequest().getParameter("PassUsuario");
               // cargoUsuario = getRequest().getParameter("IdCargo");
                query = "SELECT e FROM Empleado e, Cargo c WHERE " +
                    "e.nomUsuario = '" + nomUsuario + "' and " +
                    "e.passUsuario = '" + passUsuario + "' and " +
                    "e.idCargo = c.idCargo";
                /*idEmpleado,nomEmpleado,apeEmpleado,duiEmpleado,telEmpleado,dirEmpleado, "+
                        " sexEmpleado,edaEmpleado,celEmpleado,emaEmpleado,idMunicipio,DECODE(nomUsuario,'test') nomUsuario,"+
                        " passUsuario,fecNacimiento,AuAddUsr,AuAddDat,AuModUsr*/
                listaEmpleado = genericoDAO.find(query,null,null);
                query = "SELECT count(e) FROM Empleado e WHERE " +
                    "e.nomUsuario = '" + nomUsuario + "' and " +
                    "e.passUsuario  = '" + passUsuario + "'";
  //                  "e.idCargo = '" + cargoUsuario + "'";
                total = genericoDAO.countRow(query);
                JSONObject obj = new JSONObject(); 
                for(Empleado e: listaEmpleado){
                //for(int i=0;i<listaEmpleado.size();i++){
                //   Object vec[] = (Object[]) listaEmpleado.get(i);
                   idEmpleado = e.getIdEmpleado();
                   nomEmpleado = e.getNomUsuario();
                   idCargo = e.getIdCargo().getIdCargo(); 
                     
                    if(total == 0){
                        obj.element("login",0);
                    }else{
                        obj.element("login",1);
                        Map session = ActionContext.getContext().getSession();
                        session.put("idUsuario",idEmpleado);
                        session.put("idCargo",idCargo);
                        session.put("nomEmpleado", nomEmpleado);
                    } 
   

            }
           /*Error en credenciales*/
                if(total == 0){
                        obj.element("login",0);
                } 
                JSONObject jo = JSONObject.fromObject(obj);
                enviarJsonNavegador(getResponse(), jo);
        }
        
        //////////////////////////////////// Cargado de CDIs /////////////////////////////////////////
        ///////////////////////////////////  TEMPORAL ////////////////////////////////////////////////
        /*    
        try {
                ruta = "C:\\tblProyect.xml";
            
                DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();

                DocumentBuilder docBuilder = null;
            
            try {
                docBuilder = docBuilderFactory.newDocumentBuilder();
            } catch (ParserConfigurationException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            Document doc = docBuilder.parse (new File(ruta));
            doc.getDocumentElement ().normalize ();
            
            NodeList listaCdis = doc.getElementsByTagName("tblProyect");
            
            for (int i = 0; i < listaCdis.getLength(); i ++) {
                Node cdi = listaCdis.item(i);
                if (cdi.getNodeType() == Node.ELEMENT_NODE) {
                    Cdi c      = new Cdi();
                    Element elemento    = (Element) cdi;
                    String  codigoCdi   =  getTagValue("Proyecto", elemento);  
                    c.setNomCdi(codigoCdi);
                    
                    String fechaTemp = getTagValue("Incio", elemento);
                    
                    int indiceGuia = fechaTemp.indexOf("-");
                    String annio = fechaTemp.substring(0,indiceGuia);
                    fechaTemp = fechaTemp.substring(indiceGuia+1,fechaTemp.length());
                    
                    indiceGuia = fechaTemp.indexOf("-");
                    String mes = fechaTemp.substring(0,indiceGuia);
                    fechaTemp = fechaTemp.substring(indiceGuia+1,fechaTemp.length());
                    
                    indiceGuia = fechaTemp.indexOf("T");
                    String dia = fechaTemp.substring(0,indiceGuia);
                    
                    String fecha = annio + "-" + mes + "-" + dia;
                    
                    try {
                        c.setFecApertura(formatoDelTexto.parse(fecha));
                    } catch (ParseException ex) {
                        Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    Municipio m2 = new Municipio();
                    m2.setIdMunicipio(1);  
                    c.setIdMunicipio(m2);
                                          
                    c.setEstCdi(1);
                    
                    Date    date    =   new Date();
                    Calendar cal = Calendar.getInstance();
                    date=cal.getTime();
                    
                    c.setDesCdi(getTagValue("Nombre", elemento));
                    
                    c.setFecIniCdi(date);
                    
                    c.setAuAddUsr(Integer.valueOf(idEmpleado));
                    c.setAuAddDat(date);
                    
                    genericoDAO.save(c);

                }
            }  

            } catch (SAXException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            }catch(HibernateException e){
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, e);
                enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
            
        }
        */
        //////////////////////////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////////////////
        
               
        //////////////////////////////////// Cargado de Beneficiarios ////////////////////////////////
        ///////////////////////////////////  TEMPORAL ////////////////////////////////////////////////
        /*   
        try {
                ruta = "C:\\Child.xml";
            
                DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();

                DocumentBuilder docBuilder = null;
            
            try {
                docBuilder = docBuilderFactory.newDocumentBuilder();
            } catch (ParserConfigurationException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            Document doc = docBuilder.parse (new File(ruta));
            doc.getDocumentElement ().normalize ();
            
            NodeList listaBeneficiarios = doc.getElementsByTagName("Child");
            
            for (int i = 0; i < listaBeneficiarios.getLength(); i ++) {
                Node ben = listaBeneficiarios.item(i);
                if (ben.getNodeType() == Node.ELEMENT_NODE) {
                    Beneficiario b      = new Beneficiario();
                    Element elemento    = (Element) ben;
                    
                    String  codigoBen   =  getTagValue("Codigo", elemento);  
                    b.setCodBeneficiario(codigoBen);
                    
                    String fechaTemp = getTagValue("FechaNacimieno", elemento);
                    
                    int indiceGuia = fechaTemp.indexOf("-");
                    String annio = fechaTemp.substring(0,indiceGuia);
                    fechaTemp = fechaTemp.substring(indiceGuia+1,fechaTemp.length());
                    
                    indiceGuia = fechaTemp.indexOf("-");
                    String mes = fechaTemp.substring(0,indiceGuia);
                    fechaTemp = fechaTemp.substring(indiceGuia+1,fechaTemp.length());
                    
                    indiceGuia = fechaTemp.indexOf("T");
                    String dia = fechaTemp.substring(0,indiceGuia);
                    
                    String fecha = annio + "-" + mes + "-" + dia;
                    
                    try {
                        b.setFecNacimiento(formatoDelTexto.parse(fecha));
                    } catch (ParseException ex) {
                        Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    String  generoBen   =  getTagValue("Genero", elemento);  
                    b.setSexBeneficiario(generoBen);
                    
                    List<Cdi> listaCdis = null;
                    listaCdis = genericoDAO.find("SELECT c FROM Cdi c WHERE c.nomCdi = '" + getTagValue("Proyecto", elemento) + "' ", null, null);
                    
                    b.setIdCdi(listaCdis.get(0));

                    b.setIdMunicipio(listaCdis.get(0).getIdMunicipio());
                    
                    Nivelescolaridad n = new Nivelescolaridad();
                    n.setIdNivelEscolaridad(15);
                    b.setIdNivEscolaridad(n);
                                          
                    b.setEstBeneficiario(1);
                    
                    Date    date    =   new Date();
                    Calendar cal = Calendar.getInstance();
                    date=cal.getTime();
                    
                    b.setAuAddUsr(Integer.valueOf(idEmpleado));
                    b.setAuAddDat(date);
                    
                    genericoDAO.save(b);

                }
            }  

            } catch (SAXException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            }catch(HibernateException e){
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, e);
                enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
            
        }
        */
        //////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
            
        //////////////////////////////////// Cargado inicial de edades ///////////////////////////////
        ///////////////////////////////////  TEMPORAL ////////////////////////////////////////////////
            /*List<Beneficiario> beneficiariosF = null;
            SimpleDateFormat sdf    =   new SimpleDateFormat("dd/MM/yyyy");
            String  sql = "SELECT b FROM Beneficiario b";
            beneficiariosF = genericoDAO.find(sql,null,null);
            for(Beneficiario be: beneficiariosF){
                Beneficiario    ben =   new Beneficiario();
                ben = be;
                ben.setEdaBeneficiario(edad(sdf.format(be.getFecNacimiento())));
                genericoDAO.update(ben);
            }*/
            
        //////////////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
        return null; 
 }     
    @Override    
    public void agregarEntidad(Object o) {

    }
    
    private static String getTagValue(String sTag, Element eElement){
	  NodeList nlList= eElement.getElementsByTagName(sTag).item(0).getChildNodes();
	  Node nValue = (Node) nlList.item(0);  
	  return nValue.getNodeValue();
    }
        @Override
    public void borrarEntidad(Object o) {

    }
    @Override
    public void editarEntidad(Object o) {

    }
    @Override
    public void alimentarGrid() {
        
    }
 
    @Override
    public void reporteXls() {
        
    }
    
     public int edad(String fecha_nac) {     //fecha_nac debe tener el formato dd/MM/yyyy
        Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        String hoy = formato.format(fechaActual);
        String[] dat1 = fecha_nac.split("/");
        String[] dat2 = hoy.split("/");
        int anos = Integer.parseInt(dat2[2]) - Integer.parseInt(dat1[2]);
        int mes = Integer.parseInt(dat2[1]) - Integer.parseInt(dat1[1]);
        if (mes < 0) {
            anos = anos - 1;
        }else if (mes == 0) {
        int dia = Integer.parseInt(dat2[0]) - Integer.parseInt(dat1[0]);
        if (dia < 0) {
            anos = anos - 1;
        }
     }
    return anos;
  }
            
}
